Skip to main content

データ型:REFERENCE TO

重要

コンパイラバージョン> = V3.3.0.0では、参照は初期化されます(0)。

重要

参照がデバイス入力を参照している場合、そのアクセスは書き込みアクセスとして適用されます。コードが生成されると、コンパイラの警告が発生します: "...invalid assignment target"。

例: rInput REF= Input;

この種の構成が必要な場合は、最初に入力値をコピーする必要があります(例: rInput)書き込みアクセス権を持つ変数に。

との参照 REFERENCE データ型は暗黙的に別のオブジェクトを参照します。割り当ては、 REF= オペレーター。アクセスされると、参照は暗黙的に逆参照されるため、特別なコンテンツ演算子は必要ありません。 ^ ポインタなど。

構文

<identifier> : REFERENCE TO <data type> ;
<data type>: base type of the reference
214. 有効な宣言
PROGRAM PLC_PRG
VAR
    rspeA : REFERENCE TO DUT_SPECIAL;
    pspeA : POINTER TO DUT_SPECIAL;
    speB : DUT_SPECIAL;
END_VAR
rspeA REF= speB; // Reference rspeA is alias for speB. The code corresponds to pspeA := ADR(speB);
rspeA := speD; // The code corresponds to pspeA^ := speD;


215. 無効な宣言
ariTest : ARRAY[0..9] OF REFERENCE TO INT;
priTest : POINTER TO REFERENCE TO INT;
rriTest : REFERENCE TO REFERENCE TO INT;
rbitTest : REFERENCE TO BIT;


参照型は、配列、ポインター、または参照の基本型として使用しないでください。さらに、参照はビット変数を参照してはなりません。これらの種類の構造は、コンパイラエラーを生成します。

注記

識別子とそのエイリアスを使用して同じメモリセルに同時にアクセスすると、プログラムの可読性が困難になります。

例: speBrspeA

ヒント

への参照とポインタ BIT 変数は 無効 宣言、および基本型の配列要素 BIT

216.

参照が割り当てられている場合 :=の場合、参照が左側、右側、または両側にあるかに関係なく、値は常にコピーされます。

  • Ref := value 値を書き込みます value 参照が指す場所に移動します。ポインタ表記では次のようになります。 Ref^ := value

  • value := Ref 参照が指す値を後に書き込みます value。ポインタ表記では次のようになります。 value := Ref^

  • Ref1 := Ref2 値を書き込みます Ref2 に指差す。場所で Ref1 に指差す。ポインタ表記では次のようになります。 Ref1^ := Ref2^

いつ REF= が使用される場合、アドレスは常に適用され、左側に参照が存在する必要があります。

  • Ref REF= value: 参照先は次のとおりです。 value。ポインタ表記では次のようになります。 Ref :=ADR(value)

  • Ref1 REF= Ref2: Ref1と同じ値を指します Ref2。ポインタ表記では次のようになります。Ref1 := Ref2

  • Value REF = Ref コンパイルエラーが発生する



ヒント

宣言では、 REFERENCE TO INT REF= value のように振る舞う REFERENCE TO INT := value

参照とポインタの比較

. 参照には、ポインターに比べて次の利点があります。
  • 使いやすさ:

    参照は、間接参照せずに、参照されるオブジェクトのコンテンツに直接アクセスできます。

  • 値を渡すときのより細かく単純な構文:

    ポインタの代わりにアドレス演算子なしで参照を渡す関数ブロックの呼び出し

    例: fbDoIt(riInput:=iValue);

    それ以外の: fbDoIt_1(piInput:=ADR(iValue));

  • 型安全性:

    2つの参照を割り当てる場合、コンパイラーはそれらの基本タイプが一致するかどうかをチェックします。ポインタの場合、これはチェックされません。

参照の有効性のテスト

演算子を使用できます __ISVALIDREF 参照が有効な値(0に等しくない値を意味する)を指しているかどうかを確認します。

構文

<boolean variable name> := __ISVALIDREF( <reference name> );

<reference name>:で宣言された識別子 REFERENCE TO

ブール変数は TRUE 参照が有効な値を指している場合。それ以外の場合は FALSE

PROGRAM PLC_PRG
VAR
    iAlfa : INT;
    riBravo : REFERENCE TO INT;
    riCharlie : REFERENCE TO INT;
    bIsRef_Bravo : BOOL := FALSE;
    bIsRef_Charlie : BOOL := FALSE;
END_VAR
iAlfa := iAlfa + 1;
riBravo REF= iAlfa;
riCharlie REF= 0;
bIsRef_Bravo := __ISVALIDREF(riBravo);  (* becomes TRUE, because riBravo references to iAlfa, which is non-zero *)
bIsRef_Charlie := __ISVALIDREF(riCharlie); (* becomes FALSE, because riCharlie is set to 0 *)

ヒント

コンパイラバージョン3.5.7.40以降では、暗黙的な監視機能 CheckPointer タイプの変数に作用します REFERENCE TO ポインタ変数の場合と同じように。